package com.copa.l283;

import java.util.Arrays;

/**
 * @author copa
 * @createDate 2022-06-02 16:07
 * @function 两次遍历法
 */
public class Test1 {

    public void moveZeroes(int[] nums) {
        // 先定义0的界限index，从这里往右就是0
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                // 如果遍历的数不为0，则该位置跟index位置调换，并将index往右移
                nums[index] = nums[i];
                index++;
            }
        }
        for (int i = index; i < nums.length; i++) {
            // 后续处理，index往右的全是0
            nums[i] = 0;
        }
    }

    /**
     * 以下是我自己想出来的，就是看到0就移动到后面，跟上面方法相反...看看就好...虽然通过了...但效率差...在Test2会有优化
     * @param nums
     */
    public void moveZeroes2(int[] nums) {
        // 定义左边
        int left = 0;
        // 定义右边，放0的位置
        int right = nums.length - 1;
        while (left != nums.length && left < right) {
            if (nums[left] == 0) {
                // 如果左边遇到0，则[left,right]范围内的所有位置都要往前一位，right设置为0，所以时间复杂度就差在这里了
                for (int i = left; i < right; i++) {
                    nums[i] = nums[i + 1];
                }
                nums[right--] = 0;
            }
            if (nums[left] != 0) {
                // 若不为0，则left往右走
                left++;
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {0,1,0,3,12};
        //int[] nums = {0,0,1};
        new Test1().moveZeroes(nums);
        System.out.println(Arrays.toString(nums));
    }
}
